#include "mainwindow.h"
#include <iostream>

// 主窗口构造函数
MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)  // 调用父类构造函数
#ifdef Q_OS_WIN
    , m_comInitialized(false)  // Windows平台下初始化COM状态为未初始化
#endif
{
    setupUI();              // 设置用户界面
    createConnections();    // 创建信号槽连接
    setupTable();           // 设置表格

    setWindowTitle("桌面图标管理器 Qt6 - 真实数据版");  // 设置窗口标题
    resize(1200, 700);      // 设置窗口大小

    // 延迟100毫秒后自动扫描桌面
    QTimer::singleShot(100, this, &MainWindow::onScanDesktop);
}

// 主窗口析构函数
MainWindow::~MainWindow()
{
#ifdef Q_OS_WIN
    cleanupCOM();  // Windows平台下清理COM资源
#endif
}

// 设置用户界面
void MainWindow::setupUI()
{
    m_centralWidget = new QWidget(this);        // 创建中心部件
    setCentralWidget(m_centralWidget);          // 设置为中心部件

    m_mainLayout = new QVBoxLayout(m_centralWidget);  // 创建垂直主布局
    m_controlLayout = new QHBoxLayout();              // 创建水平控制布局

    // 创建控制按钮
    m_btnScan = new QPushButton("🔍 扫描桌面", this);    // 扫描桌面按钮
    m_btnArrange = new QPushButton("📐 整理图标", this);  // 整理图标按钮
    m_btnExport = new QPushButton("💾 导出数据", this);   // 导出数据按钮
    m_btnRefresh = new QPushButton("🔄 刷新", this);      // 刷新按钮

    // 创建列数设置微调框
    m_spinColumns = new QSpinBox(this);
    m_spinColumns->setRange(1, 20);           // 设置范围1-20
    m_spinColumns->setValue(6);               // 设置默认值6
    m_spinColumns->setPrefix("列数: ");       // 设置前缀文本
    m_spinColumns->setToolTip("每行显示的图标数量");  // 设置提示文本

    // 创建图标宽度设置微调框
    m_spinIconWidth = new QSpinBox(this);
    m_spinIconWidth->setRange(32, 200);       // 设置范围32-200
    m_spinIconWidth->setValue(80);            // 设置默认值80
    m_spinIconWidth->setPrefix("宽度: ");     // 设置前缀文本
    m_spinIconWidth->setSuffix(" px");        // 设置后缀文本

    // 创建图标高度设置微调框
    m_spinIconHeight = new QSpinBox(this);
    m_spinIconHeight->setRange(32, 200);      // 设置范围32-200
    m_spinIconHeight->setValue(80);           // 设置默认值80
    m_spinIconHeight->setPrefix("高度: ");    // 设置前缀文本
    m_spinIconHeight->setSuffix(" px");       // 设置后缀文本

    m_progressBar = new QProgressBar(this);   // 创建进度条
    m_progressBar->setVisible(false);         // 初始隐藏进度条

    m_lblStatus = new QLabel("准备扫描桌面...", this);  // 创建状态标签

    // 创建表格部件
    m_tableWidget = new QTableWidget(this);

    // 创建设置布局
    QHBoxLayout* settingsLayout = new QHBoxLayout();
    settingsLayout->addWidget(m_spinColumns);      // 添加列数设置
    settingsLayout->addWidget(m_spinIconWidth);    // 添加宽度设置
    settingsLayout->addWidget(m_spinIconHeight);   // 添加高度设置
    settingsLayout->addStretch();                  // 添加伸缩空间

    // 将控件添加到控制布局
    m_controlLayout->addWidget(m_btnScan);         // 添加扫描按钮
    m_controlLayout->addWidget(m_btnArrange);      // 添加整理按钮
    m_controlLayout->addWidget(m_btnExport);       // 添加导出按钮
    m_controlLayout->addWidget(m_btnRefresh);      // 添加刷新按钮
    m_controlLayout->addLayout(settingsLayout);    // 添加设置布局
    m_controlLayout->addStretch();                 // 添加伸缩空间
    m_controlLayout->addWidget(m_lblStatus);       // 添加状态标签

    // 将布局添加到主布局
    m_mainLayout->addLayout(m_controlLayout);      // 添加控制布局
    m_mainLayout->addWidget(m_progressBar);        // 添加进度条
    m_mainLayout->addWidget(m_tableWidget);        // 添加表格
}

// 设置表格
void MainWindow::setupTable()
{
    m_tableWidget->setColumnCount(7);  // 设置表格列数为7
    // 设置水平表头标签
    m_tableWidget->setHorizontalHeaderLabels({ "序号", "名称", "类型", "大小", "位置 (X,Y)", "修改时间", "路径" });

    m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);  // 设置选择行为为整行选择
    m_tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);          // 设置上下文菜单策略
    m_tableWidget->setSortingEnabled(true);                              // 启用排序
    m_tableWidget->setAlternatingRowColors(true);                        // 启用交替行颜色
    m_tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);   // 禁用编辑

    // 设置各列宽度
    m_tableWidget->setColumnWidth(0, 60);   // 序号列宽60
    m_tableWidget->setColumnWidth(1, 250);  // 名称列宽250
    m_tableWidget->setColumnWidth(2, 100);  // 类型列宽100
    m_tableWidget->setColumnWidth(3, 120);  // 大小列宽120
    m_tableWidget->setColumnWidth(4, 120);  // 位置列宽120
    m_tableWidget->setColumnWidth(5, 150);  // 修改时间列宽150
    m_tableWidget->setColumnWidth(6, 400);  // 路径列宽400
}

// 创建信号槽连接
void MainWindow::createConnections()
{
    // 连接按钮点击信号到对应槽函数
    connect(m_btnScan, &QPushButton::clicked, this, &MainWindow::onScanDesktop);
    connect(m_btnArrange, &QPushButton::clicked, this, &MainWindow::onArrangeIcons);
    connect(m_btnExport, &QPushButton::clicked, this, &MainWindow::onExportData);
    connect(m_btnRefresh, &QPushButton::clicked, this, &MainWindow::onRefresh);

    // 连接表格自定义上下文菜单请求信号
    connect(m_tableWidget, &QTableWidget::customContextMenuRequested,
        this, &MainWindow::onTableContextMenu);
    // 连接表格双击信号
    connect(m_tableWidget, &QTableWidget::doubleClicked,
        this, &MainWindow::openSelectedFile);
}

// 扫描桌面槽函数
void MainWindow::onScanDesktop()
{
    m_progressBar->setVisible(true);      // 显示进度条
    m_lblStatus->setText("正在扫描桌面...");  // 更新状态文本
    m_btnScan->setEnabled(false);         // 禁用扫描按钮
    qApp->processEvents();                // 处理事件循环，更新UI

    m_iconList.clear();                   // 清空图标列表
    m_tableWidget->setRowCount(0);        // 清空表格行
    m_progressBar->setValue(0);           // 重置进度条

#ifdef Q_OS_WIN
    // Windows平台：获取桌面图标
    if (getWindowsDesktopIcons()) {
        m_lblStatus->setText(QString("✅ 扫描完成！找到 %1 个桌面项目").arg(m_iconList.size()));
    }
    else {
        m_lblStatus->setText("❌ 扫描失败，请检查权限或重试");
        QMessageBox::warning(this, "错误", "无法扫描桌面项目");
    }
#else
    // 非Windows平台：显示提示信息
    m_lblStatus->setText("⚠️ 此功能仅支持Windows平台");
    QMessageBox::information(this, "提示", "此功能仅支持Windows平台");
#endif

    m_progressBar->setVisible(false);  // 隐藏进度条
    m_btnScan->setEnabled(true);       // 启用扫描按钮
}

// 整理图标槽函数
void MainWindow::onArrangeIcons()
{
    // 检查图标列表是否为空
    if (m_iconList.isEmpty()) {
        QMessageBox::information(this, "提示", "请先扫描桌面图标");
        return;
    }

    // 获取用户设置的参数
    int columns = m_spinColumns->value();       // 列数
    int iconWidth = m_spinIconWidth->value();   // 图标宽度
    int iconHeight = m_spinIconHeight->value(); // 图标高度

    // 获取主屏幕信息 (Qt6方式)
    QScreen* primaryScreen = QGuiApplication::primaryScreen();
    QRect screenGeometry = primaryScreen->geometry();  // 屏幕几何信息
    int startX = 50;  // 起始X坐标
    int startY = 50;  // 起始Y坐标

    m_progressBar->setVisible(true);                    // 显示进度条
    m_progressBar->setMaximum(m_iconList.size());       // 设置进度条最大值
    m_lblStatus->setText("正在整理图标位置...");          // 更新状态文本

#ifdef Q_OS_WIN
    // 查找桌面ListView窗口句柄
    HWND hDesktopListView = findDesktopListViewHWND();
    if (!hDesktopListView) {
        QMessageBox::warning(this, "警告", "无法访问桌面窗口，将以模拟模式运行");
    }

    int successCount = 0;  // 成功移动计数
    // 遍历所有图标
    for (int i = 0; i < m_iconList.size(); ++i) {
        // 计算行列位置
        int row = i / columns;
        int col = i % columns;

        // 计算新位置
        QPoint newPos(startX + col * iconWidth, startY + row * iconHeight);

        // 确保位置在屏幕范围内
        if (newPos.x() + iconWidth > screenGeometry.width()) {
            newPos.setX(screenGeometry.width() - iconWidth - 10);
        }
        if (newPos.y() + iconHeight > screenGeometry.height()) {
            newPos.setY(screenGeometry.height() - iconHeight - 10);
        }

        // 设置图标位置
        if (hDesktopListView) {
            if (setIconPosition(hDesktopListView, i, newPos)) {
                successCount++;                    // 成功计数增加
                m_iconList[i].position = newPos;  // 更新图标位置
            }
        }
        else {
            m_iconList[i].position = newPos;      // 模拟模式下更新位置
        }

        m_progressBar->setValue(i + 1);  // 更新进度条
        qApp->processEvents();           // 处理事件
    }

    // 刷新表格显示
    m_tableWidget->setRowCount(0);
    for (const IconInfo& icon : m_iconList) {
        addIconToTable(icon);
    }

    m_lblStatus->setText(QString("✅ 图标整理完成 (成功移动: %1/%2)").arg(successCount).arg(m_iconList.size()));
#else
    m_lblStatus->setText("⚠️ 此功能仅支持Windows平台");
#endif

    m_progressBar->setVisible(false);  // 隐藏进度条
}

// 导出数据槽函数
void MainWindow::onExportData()
{
    // 检查是否有数据可导出
    if (m_iconList.isEmpty()) {
        QMessageBox::information(this, "提示", "没有数据可导出，请先扫描桌面");
        return;
    }

    // 生成文件名（包含时间戳）
    QString fileName = QDateTime::currentDateTime().toString("'桌面数据_'yyyyMMdd_hhmmss'.csv'");
    QFile file(fileName);

    // 尝试打开文件
    if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        QTextStream stream(&file);
        stream.setEncoding(QStringConverter::Utf8); // Qt6方式设置UTF-8编码

        // 写入UTF-8 BOM以确保Excel正确显示中文
        stream << "\uFEFF";

        // 写入CSV表头
        stream << "序号,名称,类型,大小,位置X,位置Y,修改时间,路径,隐藏属性,文件夹\n";

        // 遍历所有图标数据
        for (int i = 0; i < m_iconList.size(); ++i) {
            const IconInfo& icon = m_iconList[i];
            stream << i + 1 << ","
                << "\"" << icon.name << "\","
                << "\"" << icon.type << "\","
                << "\"" << formatFileSize(icon.size) << "\","
                << icon.position.x() << ","
                << icon.position.y() << ","
                << "\"" << icon.lastModified.toString("yyyy-MM-dd hh:mm:ss") << "\","
                << "\"" << icon.filePath << "\","
                << (icon.isHidden ? "是" : "否") << ","
                << (icon.isFolder ? "是" : "否") << "\n";
        }

        file.close();  // 关闭文件
        m_lblStatus->setText(QString("✅ 数据已导出到: %1").arg(fileName));
        QMessageBox::information(this, "成功", QString("数据已导出到: %1").arg(fileName));
    }
    else {
        QMessageBox::warning(this, "错误", "无法创建导出文件");
    }
}

// 刷新槽函数
void MainWindow::onRefresh()
{
    onScanDesktop();  // 调用扫描桌面函数
}

// 表格上下文菜单槽函数
void MainWindow::onTableContextMenu(const QPoint& pos)
{
    QTableWidgetItem* item = m_tableWidget->itemAt(pos);  // 获取点击位置的项
    if (!item) return;  // 如果没有项则返回

    int row = item->row();  // 获取行号
    if (row < 0 || row >= m_iconList.size()) return;  // 检查行号有效性

    // 创建上下文菜单
    QMenu menu(this);
    QAction* openAction = menu.addAction("📂 打开文件");           // 打开文件动作
    QAction* openLocationAction = menu.addAction("📁 打开文件位置"); // 打开文件位置动作
    menu.addSeparator();                                           // 添加分隔符
    QAction* refreshAction = menu.addAction("🔄 刷新");            // 刷新动作

    // 显示菜单并获取选中的动作
    QAction* selectedAction = menu.exec(m_tableWidget->viewport()->mapToGlobal(pos));

    // 根据选中的动作执行相应操作
    if (selectedAction == openAction) {
        openSelectedFile();      // 打开选中的文件
    }
    else if (selectedAction == openLocationAction) {
        openFileLocation();      // 打开文件所在位置
    }
    else if (selectedAction == refreshAction) {
        onRefresh();             // 刷新
    }
}

// 打开文件位置
void MainWindow::openFileLocation()
{
    QTableWidgetItem* item = m_tableWidget->currentItem();  // 获取当前选中的项
    if (!item) return;

    int row = item->row();  // 获取行号
    if (row < 0 || row >= m_iconList.size()) return;

    QString filePath = m_iconList[row].filePath;  // 获取文件路径
    QFileInfo fileInfo(filePath);                 // 获取文件信息

#ifdef Q_OS_WIN
    QString command = "explorer.exe";  // Windows资源管理器命令
    QStringList args;                  // 参数列表

    // 根据文件类型设置参数
    if (fileInfo.isDir() || fileInfo.isFile()) {
        if (fileInfo.isDir()) {
            // 如果是目录，直接打开目录
            args << QDir::toNativeSeparators(filePath);
        }
        else {
            // 如果是文件，选中并显示文件
            args << "/select," << QDir::toNativeSeparators(filePath);
        }

        // 启动进程
        QProcess process;
        process.start(command, args);
        if (!process.waitForStarted(3000)) {
            QMessageBox::warning(this, "错误", "无法打开文件位置");
        }
    }
#endif
}

// 打开选中的文件
void MainWindow::openSelectedFile()
{
    QTableWidgetItem* item = m_tableWidget->currentItem();  // 获取当前选中的项
    if (!item) return;

    int row = item->row();  // 获取行号
    if (row < 0 || row >= m_iconList.size()) return;

    QString filePath = m_iconList[row].filePath;  // 获取文件路径

#ifdef Q_OS_WIN
    // 使用ShellExecute打开文件
    HINSTANCE result = ShellExecuteW(
        nullptr,           // 父窗口句柄
        L"open",           // 操作类型：打开
        reinterpret_cast<const wchar_t*>(filePath.utf16()),  // 文件路径
        nullptr,           // 参数
        nullptr,           // 目录
        SW_SHOWNORMAL      // 显示方式：正常显示
    );

    // 检查执行结果
    if (reinterpret_cast<intptr_t>(result) <= 32) {
        QMessageBox::warning(this, "错误", "无法打开文件");
    }
#endif
}

// 添加图标到表格
void MainWindow::addIconToTable(const IconInfo& icon)
{
    int row = m_tableWidget->rowCount();  // 获取当前行数
    m_tableWidget->insertRow(row);        // 插入新行

    // 设置各列数据
    m_tableWidget->setItem(row, 0, new QTableWidgetItem(QString::number(row + 1)));  // 序号
    m_tableWidget->setItem(row, 1, new QTableWidgetItem(icon.name));                 // 名称
    m_tableWidget->setItem(row, 2, new QTableWidgetItem(icon.type));                 // 类型
    m_tableWidget->setItem(row, 3, new QTableWidgetItem(formatFileSize(icon.size))); // 大小
    m_tableWidget->setItem(row, 4, new QTableWidgetItem(                             // 位置
        QString("%1, %2").arg(icon.position.x()).arg(icon.position.y())));
    m_tableWidget->setItem(row, 5, new QTableWidgetItem(                             // 修改时间
        icon.lastModified.toString("yyyy-MM-dd HH:mm:ss")));
    m_tableWidget->setItem(row, 6, new QTableWidgetItem(icon.filePath));             // 路径

    // 为不同类型设置不同颜色和提示
    for (int col = 0; col < m_tableWidget->columnCount(); ++col) {
        QTableWidgetItem* item = m_tableWidget->item(row, col);
        if (item) {
            if (icon.isHidden) {
                // 隐藏文件：浅红色背景
                item->setBackground(QColor(255, 240, 240));
                item->setToolTip("隐藏文件");
            }
            else if (icon.isFolder) {
                // 文件夹：浅蓝色背景
                item->setBackground(QColor(240, 248, 255));
                item->setToolTip("文件夹");
            }
        }
    }
}

// 格式化文件大小
QString MainWindow::formatFileSize(qint64 size) const
{
    if (size == 0) return "0 B";  // 大小为0直接返回

    const QString units[] = { "B", "KB", "MB", "GB", "TB" };  // 单位数组
    int unitIndex = 0;             // 单位索引
    double fileSize = size;        // 文件大小

    // 循环计算合适的单位
    while (fileSize >= 1024.0 && unitIndex < 4) {
        fileSize /= 1024.0;
        unitIndex++;
    }

    // 格式化输出，小数位数根据单位调整
    return QString("%1 %2").arg(fileSize, 0, 'f', unitIndex > 0 ? 1 : 0).arg(units[unitIndex]);
}

// 计算模拟位置（用于非Windows平台或无法获取真实位置时）
QPoint MainWindow::calculateSimulatedPosition(int index)
{
    int columns = 8;        // 默认列数
    int iconWidth = 80;     // 图标宽度
    int iconHeight = 80;    // 图标高度

    // 计算行列位置
    int row = index / columns;
    int col = index % columns;

    // 返回计算的位置
    return QPoint(50 + col * iconWidth, 50 + row * iconHeight);
}

#ifdef Q_OS_WIN
// 初始化COM（组件对象模型）
bool MainWindow::initializeCOM()
{
    if (m_comInitialized) {
        return true;  // 如果已经初始化则直接返回
    }

    // 初始化COM库
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    if (FAILED(hr) && hr != RPC_E_CHANGED_MODE) {
        qDebug() << "COM初始化失败:" << _com_error(hr).ErrorMessage();
        return false;
    }

    m_comInitialized = true;  // 标记为已初始化
    return true;
}

// 清理COM资源
void MainWindow::cleanupCOM()
{
    if (m_comInitialized) {
        CoUninitialize();     // 反初始化COM库
        m_comInitialized = false;  // 标记为未初始化
    }
}

// 获取Windows桌面图标
bool MainWindow::getWindowsDesktopIcons()
{
    if (!initializeCOM()) {  // 初始化COM
        return false;
    }

    IShellFolder* pDesktopFolder = nullptr;
    if (!getDesktopShellFolder(&pDesktopFolder)) {  // 获取桌面文件夹
        return false;
    }

    // 枚举桌面项目
    bool result = enumerateDesktopItems(pDesktopFolder);
    pDesktopFolder->Release();  // 释放COM对象

    return result;
}

// 获取桌面Shell文件夹
bool MainWindow::getDesktopShellFolder(IShellFolder** ppShellFolder)
{
    // 获取桌面文件夹接口
    HRESULT hr = SHGetDesktopFolder(ppShellFolder);
    if (FAILED(hr)) {
        qDebug() << "获取桌面文件夹失败:" << _com_error(hr).ErrorMessage();
        return false;
    }
    return true;
}

// 枚举桌面项目
bool MainWindow::enumerateDesktopItems(IShellFolder* pShellFolder)
{
    IEnumIDList* pEnumIDList = nullptr;
    // 枚举桌面对象（包括文件夹、非文件夹和隐藏文件）
    HRESULT hr = pShellFolder->EnumObjects(nullptr,
        SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN,
        &pEnumIDList);

    if (FAILED(hr)) {
        qDebug() << "枚举桌面项目失败:" << _com_error(hr).ErrorMessage();
        return false;
    }

    // 获取真实图标位置
    HWND hDesktopListView = findDesktopListViewHWND();  // 查找桌面ListView窗口
    int totalIconCount = hDesktopListView ? getDesktopIconCount(hDesktopListView) : 0;  // 获取图标总数

    m_progressBar->setRange(0, 0);  // 设置不确定进度

    LPITEMIDLIST pidlItem = nullptr;  // 项目ID列表
    int itemCount = 0;                // 项目计数

    // 遍历所有桌面项目
    while (pEnumIDList->Next(1, &pidlItem, nullptr) == S_OK) {
        IconInfo iconInfo;
        iconInfo.iconIndex = itemCount;  // 设置图标索引

        // 获取各项属性
        iconInfo.name = getItemDisplayName(pShellFolder, pidlItem);  // 显示名称
        iconInfo.filePath = getItemPath(pidlItem);                   // 文件路径
        iconInfo.lastModified = getItemModifiedDate(pShellFolder, pidlItem);  // 修改时间
        iconInfo.size = getItemSize(pShellFolder, pidlItem);         // 文件大小

        // 获取属性
        bool isFolder = false, isHidden = false;
        getItemAttributes(pShellFolder, pidlItem, isFolder, isHidden);  // 获取属性
        iconInfo.isFolder = isFolder;     // 是否为文件夹
        iconInfo.isHidden = isHidden;     // 是否为隐藏文件
        iconInfo.type = isFolder ? "文件夹" : "文件";  // 设置类型显示文本

        // 获取图标位置
        if (hDesktopListView && itemCount < totalIconCount) {
            QPoint realPos = getIconPosition(hDesktopListView, itemCount);  // 获取真实位置
            if (realPos.x() >= 0 && realPos.y() >= 0) {
                iconInfo.position = realPos;  // 使用真实位置
            }
            else {
                iconInfo.position = calculateSimulatedPosition(itemCount);  // 使用模拟位置
            }
        }
        else {
            iconInfo.position = calculateSimulatedPosition(itemCount);  // 使用模拟位置
        }

        m_iconList.append(iconInfo);      // 添加到图标列表
        addIconToTable(iconInfo);         // 添加到表格

        CoTaskMemFree(pidlItem);          // 释放内存
        pidlItem = nullptr;
        itemCount++;

        // 更新状态
        m_lblStatus->setText(QString("正在扫描: %1 (%2/%3)").arg(iconInfo.name).arg(itemCount).arg(totalIconCount > 0 ? totalIconCount : itemCount));
        qApp->processEvents();  // 处理事件，更新UI
    }

    pEnumIDList->Release();  // 释放枚举器

    if (hDesktopListView) {
        // 刷新桌面显示
        ::InvalidateRect(hDesktopListView, NULL, TRUE);  // 无效化矩形区域
        ::UpdateWindow(hDesktopListView);                // 更新窗口
    }

    return true;
}

#ifdef Q_OS_WIN
// 获取项目显示名称（改进版本）
QString MainWindow::getItemDisplayName(IShellFolder* pShellFolder, LPITEMIDLIST pidl)
{
    STRRET strret;
    // 获取显示名称
    HRESULT hr = pShellFolder->GetDisplayNameOf(pidl, SHGDN_NORMAL, &strret);

    if (SUCCEEDED(hr)) {
        WCHAR szName[MAX_PATH];
        // 使用动态加载的方式调用 StrRetToBufW
        HMODULE hShell32 = GetModuleHandleW(L"shell32.dll");  // 获取shell32模块句柄
        if (hShell32) {
            // 定义函数指针类型
            typedef HRESULT(WINAPI* StrRetToBufWFunc)(STRRET* pstr, LPCITEMIDLIST pidl, LPWSTR pszBuf, UINT cchBuf);

            // 获取函数地址
            StrRetToBufWFunc pStrRetToBufW = (StrRetToBufWFunc)GetProcAddress(hShell32, "StrRetToBufW");

            if (pStrRetToBufW) {
                // 使用动态加载的函数
                hr = pStrRetToBufW(&strret, pidl, szName, ARRAYSIZE(szName));
                if (SUCCEEDED(hr)) {
                    return QString::fromWCharArray(szName);  // 成功获取名称
                }
            }
        }

        // 备用方法：使用其他方式获取显示名称
        return getItemDisplayNameFallback(pShellFolder, pidl);
    }

    return "未知名称";  // 默认返回
}

// 获取项目显示名称的备用方法
QString MainWindow::getItemDisplayNameFallback(IShellFolder* pShellFolder, LPITEMIDLIST pidl)
{
    // 方法1：尝试使用 SHGetNameFromIDList
    PWSTR pszName = nullptr;
    HRESULT hr = SHGetNameFromIDList(pidl, SIGDN_NORMALDISPLAY, &pszName);  // 获取显示名称
    if (SUCCEEDED(hr) && pszName) {
        QString result = QString::fromWCharArray(pszName);
        CoTaskMemFree(pszName);  // 释放内存
        return result;
    }

    // 方法2：尝试使用文件路径获取文件名
    QString filePath = getItemPath(pidl);
    if (!filePath.isEmpty()) {
        QFileInfo fileInfo(filePath);
        return fileInfo.fileName();  // 返回文件名
    }

    // 方法3：使用 GetDisplayNameOf 的另一种方式
    STRRET strret;
    hr = pShellFolder->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &strret);  // 获取解析名称
    if (SUCCEEDED(hr)) {
        WCHAR szPath[MAX_PATH];
        switch (strret.uType) {
        case STRRET_WSTR:
        {
            QString result = QString::fromWCharArray(strret.pOleStr);
            CoTaskMemFree(strret.pOleStr);  // 释放内存
            return QFileInfo(result).fileName();  // 返回文件名
        }
        case STRRET_OFFSET:
            return QString::fromWCharArray((LPCWSTR)(((LPBYTE)pidl) + strret.uOffset));  // 偏移方式
        case STRRET_CSTR:
            return QString::fromLocal8Bit(strret.cStr);  // C字符串方式
        }
    }

    return "未知名称";  // 默认返回
}
#endif

// 获取项目路径
QString MainWindow::getItemPath(LPITEMIDLIST pidl)
{
    WCHAR szPath[MAX_PATH];
    // 从ID列表获取路径
    if (SHGetPathFromIDListW(pidl, szPath)) {
        return QString::fromWCharArray(szPath);  // 成功返回路径
    }
    return "";  // 失败返回空字符串
}

// 获取项目修改日期
QDateTime MainWindow::getItemModifiedDate(IShellFolder* pShellFolder, LPITEMIDLIST pidl)
{
    // 简化实现：使用文件系统获取修改时间
    QString filePath = getItemPath(pidl);
    if (!filePath.isEmpty()) {
        QFileInfo fileInfo(filePath);
        if (fileInfo.exists()) {
            return fileInfo.lastModified();  // 返回文件修改时间
        }
    }

    return QDateTime::currentDateTime();  // 默认返回当前时间
}

// 获取项目大小
qint64 MainWindow::getItemSize(IShellFolder* pShellFolder, LPITEMIDLIST pidl)
{
    // 简化实现：使用文件系统获取大小
    QString filePath = getItemPath(pidl);
    if (!filePath.isEmpty()) {
        QFileInfo fileInfo(filePath);
        if (fileInfo.exists() && fileInfo.isFile()) {
            return fileInfo.size();  // 返回文件大小
        }
    }

    return 0;  // 文件夹或无法获取时返回0
}

// 获取项目属性
bool MainWindow::getItemAttributes(IShellFolder* pShellFolder, LPITEMIDLIST pidl, bool& isFolder, bool& isHidden)
{
    SFGAOF attributes;
    // 获取Shell属性
    HRESULT hr = pShellFolder->GetAttributesOf(1, (LPCITEMIDLIST*)&pidl, &attributes);

    if (SUCCEEDED(hr)) {
        isFolder = (attributes & SFGAO_FOLDER) != 0;   // 检查是否为文件夹
        isHidden = (attributes & SFGAO_HIDDEN) != 0;   // 检查是否为隐藏文件
        return true;
    }

    // 备用方法：使用文件系统属性
    QString filePath = getItemPath(pidl);
    if (!filePath.isEmpty()) {
        QFileInfo fileInfo(filePath);
        if (fileInfo.exists()) {
            isFolder = fileInfo.isDir();      // 是否为目录
            isHidden = fileInfo.isHidden();   // 是否为隐藏文件
            return true;
        }
    }

    return false;  // 获取属性失败
}

// 查找桌面ListView窗口句柄
HWND MainWindow::findDesktopListViewHWND()
{
    HWND hDesktopListView = nullptr;

    // 方法1：通过 Progman 和 SHELLDLL_DefView 查找
    HWND hProgman = FindWindowW(L"Progman", L"Program Manager");  // 查找Program Manager窗口
    // 即使调试器显示"无法读取内存"，只要hProgman不为NULL就说明成功
    if (hProgman != NULL) {
        // 功能正常，继续执行
        std::cout << "Program Manager窗口句柄: " << hProgman << std::endl;
    }
    if (hProgman) {
        // 查找SHELLDLL_DefView窗口
        HWND hShellDllDefView = FindWindowExW(hProgman, nullptr, L"SHELLDLL_DefView", nullptr);
        if (hShellDllDefView) {
            // 查找SysListView32窗口
            hDesktopListView = FindWindowExW(hShellDllDefView, nullptr, L"SysListView32", L"FolderView");
            if (hDesktopListView) return hDesktopListView;  // 找到则返回
        }
    }

    // 方法2：遍历 WorkerW 窗口
    HWND hWorkerW = nullptr;
    while ((hWorkerW = FindWindowExW(nullptr, hWorkerW, L"WorkerW", nullptr)) != nullptr) {
        // 查找SHELLDLL_DefView窗口
        HWND hShellDllDefView = FindWindowExW(hWorkerW, nullptr, L"SHELLDLL_DefView", nullptr);
        if (hShellDllDefView) {
            // 查找SysListView32窗口
            hDesktopListView = FindWindowExW(hShellDllDefView, nullptr, L"SysListView32", L"FolderView");
            if (hDesktopListView) return hDesktopListView;  // 找到则返回
        }
    }

    qDebug() << "未找到桌面ListView窗口";
    return nullptr;  // 未找到返回空
}

// 获取桌面图标数量
int MainWindow::getDesktopIconCount(HWND hListView)
{
    if (!hListView) return 0;
    // 发送LVM_GETITEMCOUNT消息获取项目数量
    return (int)::SendMessageW(hListView, LVM_GETITEMCOUNT, 0, 0);
}

// 获取图标位置
QPoint MainWindow::getIconPosition(HWND hListView, int iconIndex)
{
    QPoint pos(-1, -1);  // 默认位置
    if (!hListView || iconIndex < 0) return pos;

    POINT point;
    // 发送LVM_GETITEMPOSITION消息获取项目位置
    LRESULT result = ::SendMessageW(hListView, LVM_GETITEMPOSITION, (WPARAM)iconIndex, (LPARAM)&point);

    if (result) {
        pos.setX(point.x);  // 设置X坐标
        pos.setY(point.y);  // 设置Y坐标
    }

    return pos;  // 返回位置
}

// 设置图标位置
bool MainWindow::setIconPosition(HWND hListView, int iconIndex, const QPoint& position)
{
    if (!hListView || iconIndex < 0) return false;

    // 发送LVM_SETITEMPOSITION消息设置项目位置
    LRESULT result = ::SendMessageW(hListView, LVM_SETITEMPOSITION,
        (WPARAM)iconIndex,
        MAKELPARAM(position.x(), position.y()));  // 将坐标打包为LPARAM

    return result != 0;  // 返回是否成功
}
#endif